package com.coder.algorithm.offer_2;

import java.util.Stack;

/**
 * 用两个栈实现队列
 *
 * @author yuhushuan
 * @date 2020/6/5 07:03
 */
public class _09_1_QueueWithTwoStacks<E> {
    public static void main(String[] args) {
        _09_1_QueueWithTwoStacks queue = new _09_1_QueueWithTwoStacks<Integer>();
        // 往空队列里添加、删除元素
        System.out.println("添加元素：1");
        queue.appendTail(1);

        System.out.println("删除的元素为：" + queue.deleteHead());

        System.out.println("添加元素：2");
        queue.appendTail(2);

        // 往非空队列里添加、删除元素
        System.out.println("添加元素：3、4");
        queue.appendTail(3);
        queue.appendTail(4);
        System.out.println("删除的元素为：" + queue.deleteHead());

        System.out.println("添加元素：5");
        queue.appendTail(5);


        // 连续删除元素直至队列为空
        System.out.println("删除的元素为：" + queue.deleteHead());
        System.out.println("删除的元素为：" + queue.deleteHead());
        System.out.println("删除的元素为：" + queue.deleteHead());
    }

    private Stack<E> stack1 = new Stack<>();
    private Stack<E> stack2 = new Stack<>();

    public void appendTail(E e) {
        stack1.push(e);
    }

    public E deleteHead() {
        if (stack2.empty()) {
            while (!stack1.empty()) {
                E e = stack1.pop();
                stack2.push(e);
            }
        }

        if (stack2.empty()) {
            throw new IllegalArgumentException("queue is empty");
        }

        return stack2.pop();
    }
}
